#ifndef CSTATE_H
#define CSTATE_H

#include "cstatemanager.h"
#include "window.h"
#include <qevent.h>
#include <iostream>

class CState
{
public:
    CState() {};
    //virtual ~CGameState();

    virtual void draw(QGLWidget * gl) = 0;    // State'o piešimo metodas su pointeriu į pagr. GLWidget
    virtual void initGL(QGLWidget * gl) = 0;    // GL inicijavimo metodas
    virtual void update() = 0;                // kažkoks tai updeitinimo metodas

    virtual void enterState() = 0;            // Vykdo kai perjungiam į kažkurį state (idėja: onStateEntry do: ...)
    virtual void leaveState() = 0;            // ... kai paliekam state
    virtual int doLogic(QList<int> Kl) = 0;

    // Mygtukų paspaudimų apdorojimas
    void handleKeys(QKeyEvent * e, bool isPressed, QHash<int,bool> &Kh, QQueue<int> &Kq) {
        if ( Kh.contains(e->key()) ) {   // hash table
            Kh[e->key()] = isPressed;
        } else {
            Kh.insert( e->key(), isPressed );
        }

        // visi paspausti mygtukai renkami į eilę, kad būtu apdoroti sekančio kadro metu
        if ( isPressed )
            Kq.enqueue( e->key() );
    }

    // Valdymo apdorojimas
    void handleControls(QList<int> &Kl, QQueue<int> &Kq) {
        Kl.clear();
        while (!Kq.isEmpty())
            Kl.append(Kq.dequeue());
    }

    // Vidinis state'o pakeitimo metodas
    //  sm - pointeris į state'ų valdytoją
    //  st - pointeris į naująjį state'ą
    void changeState(CStateManager * sm, CState * st) {
        sm->setState(st);
    };

    // Inicijavimas (nustatoma rodyklė į valdiklį)
    void init(CStateManager * p) { p_stMngr = p; }

protected:
    CStateManager * p_stMngr;      // pointeris į state'ų valdytoją
};

#endif // CSTATE_H
